from typing import Optional, List
from functools import lru_cache
from datetime import datetime, timedelta
from loguru import logger
from services.data_view_plugin_service import DataViewPluginService
import time


class GlobalIndexModel:
    
    def __init__(self):
        self.data_service = DataViewPluginService()

    def get_hk_index_data(self, days_limit: int = 365, force_refresh: bool = False) -> Optional[List]:
        """获取港股指数数据
        
        Args:
            days_limit: 数据天数限制
            force_refresh: 是否强制刷新（用于分钟数据）
        """
        if force_refresh:
            # 分钟数据每次都重新获取
            return self.data_service.load_hk_index_data(days_limit=days_limit)
        else:
            # 使用带时间戳的缓存策略
            # 当天数据使用短期缓存（每分钟更新），历史数据使用长期缓存
            current_minute = int(time.time() // 60)  # 每分钟更新一次
            return self._get_cached_hk_index_data(days_limit, current_minute)

    def get_global_index_data(self, days_limit: int = 365, force_refresh: bool = False) -> Optional[List]:
        """获取全球指数数据
        
        Args:
            days_limit: 数据天数限制
            force_refresh: 是否强制刷新（用于分钟数据）
        """
        if force_refresh:
            # 分钟数据每次都重新获取
            return self.data_service.load_global_index_data(days_limit=days_limit)
        else:
            # 使用带时间戳的缓存策略
            # 当天数据使用短期缓存（每分钟更新），历史数据使用长期缓存
            current_minute = int(time.time() // 60)  # 每分钟更新一次
            return self._get_cached_global_index_data(days_limit, current_minute)
    
    @lru_cache(maxsize=32)
    def _get_cached_hk_index_data(self, days_limit: int, cache_key: int) -> Optional[List]:
        """缓存的港股指数数据获取
        
        Args:
            days_limit: 数据天数限制
            cache_key: 缓存键（基于时间的整数）
        """
        logger.info(f"获取港股指数数据，天数限制: {days_limit}, 缓存键: {cache_key}")
        return self.data_service.load_hk_index_data(days_limit=days_limit)
    
    @lru_cache(maxsize=32)
    def _get_cached_global_index_data(self, days_limit: int, cache_key: int) -> Optional[List]:
        """缓存的全球指数数据获取
        
        Args:
            days_limit: 数据天数限制
            cache_key: 缓存键（基于时间的整数）
        """
        logger.info(f"获取全球指数数据，天数限制: {days_limit}, 缓存键: {cache_key}")
        return self.data_service.load_global_index_data(days_limit=days_limit)
    
    def clear_cache(self):
        """清除缓存"""
        logger.info("清除全球指数模型缓存")
        self._get_cached_hk_index_data.cache_clear()
        self._get_cached_global_index_data.cache_clear()